package com.sky.handler;

import com.sky.constant.MessageConstant;
import com.sky.exception.BaseException;
import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理器，处理项目中抛出的业务异常
 */
@RestControllerAdvice
/*@RestControllerAdvice 是Spring框架中用于处理全局异常的一个注解。它的作用如下：
全局异常处理：@RestControllerAdvice 注解允许你定义一个类，该类包含多个处理不同类型异常的方法。当控制器中发生异常时，Spring会自动查找匹配的异常处理方法来处理这些异常。
集中异常管理：通过使用 @RestControllerAdvice，你可以将所有异常处理逻辑集中在一个地方，这使得代码更加模块化和易于维护。
响应定制：你可以自定义异常处理方法返回的响应体。例如，当发生特定异常时，你可以返回一个特定的JSON对象或者错误码。
跨多个控制器共享异常处理逻辑：@RestControllerAdvice 注解的类会应用到所有标记了 @RequestMapping 注解的控制器上，这意味着你不需要在每个控制器中重复相同的异常处理代码。*/
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    /*@ExceptionHandler 是Spring框架中用于处理特定异常的注解。它通常与 @ControllerAdvice 或 @RestControllerAdvice 注解结合使用，以便在全局范围内处理控制器（Controller）中抛出的异常。
异常处理方法标记：@ExceptionHandler 注解用于标记一个方法，该方法将在控制器方法抛出指定异常时被调用。
指定异常类型：@ExceptionHandler 注解可以指定一个或多个异常类型，当这些类型的异常发生时，注解标记的方法将会处理它们。*/
    public Result exceptionHandler(BaseException ex){
        log.error("异常信息：{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }

    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
        String message=ex.getMessage();
        if (message.contains("Duplicate entry")){
            //Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '小智' for key 'idx_username'
            String [] split=message.split(" ");
            String username=split[2];
            String msg=username+ MessageConstant.ALREADY_EXISTS;
            return Result.error(msg);
        }
        else {
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
    }
}
